import { reqAddOrUpdateCart, reqCartList, reqUpdateCartChecked, reqDeleteCart } from '@/api'

const state = {
  shopCartList: []
}

const mutations = {
  RECEIVE_SHOPCART_LIST (state, shopCartList) {
    state.shopCartList = shopCartList
  }
}

const actions = {
  async reqAddOrUpdateCart ({ commit }, { skuId, skuNum }) {
    const result = await reqAddOrUpdateCart(skuId, skuNum)

    // 不推荐: 如果是以下写法,那么这个异步函数返回的 Promise 只有成功
    // if (result.code === 200) {
    //   return 'ok'
    // } else {
    //   return 'failed'
    // }

    // 推荐: 返回的 Promise 有成功也有失败
    if (result.code === 200) {
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  async getCartList ({ commit }) {
    const result = await reqCartList()
    if (result.code === 200) {
      commit('RECEIVE_SHOPCART_LIST', result.data)
    }
  },
  async reqUpdateCartChecked ({ commit }, { skuId, isChecked }) {
    const result = await reqUpdateCartChecked(skuId, isChecked)
    if (result.code === 200) {
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  async reqUpdateCartCheckedAll ({ commit, dispatch, state, getters }, isChecked) {
    let promises = []
    getters.cartInfoList.forEach(item => {
      // 如果这条数据本来的选中状态和传过来的值是相同的,则就不需要发送请求了,少发一次请求
      if (item.isChecked === isChecked) {
        return
      }
      // 调用上面单条修改订单选中状态的 actions
      let promise = dispatch('reqUpdateCartChecked', { skuId: item.skuId, isChecked })
      promises.push(promise)
    })

    /*
       Promise.all 是一个方法(函数)
        参数: 一个 promise 对象的数组
        返回值: 一个新的 promise 对象
          新的 promise 对象的状态是成功还是失败
          如果 promise 对象的数组当中有一个失败,那么状态就是失败,失败的原因就是第一个失败的 promise 的原因 
          如果 promise 对象的数组当中没有失败,那么状态就是成功,成功的结果是所有的 promise 成功的结果组成的数组
    */
    return Promise.all(promises)
  },
  async reqDeleteCart ({ commit }, skuId) {
    const result = await reqDeleteCart(skuId)
    if (result.code === 200) {
      return 'ok'
    } else {
      return Promise.reject(new Error('failed'))
    }
  },
  async reqDeleteCartAll ({ commit, dispatch, getters }) {
    let promises = []
    getters.cartInfoList.forEach(item => {
      if (!item.isChecked) {
        return
      }
      let promise = dispatch('reqDeleteCart', item.skuId)
      promises.push(promise)
    })
    return Promise.all(promises)
  }
}

const getters = {
  cartInfoList (state) {
    if (state.shopCartList[0] && state.shopCartList[0].cartInfoList) {
      return state.shopCartList[0].cartInfoList
    }
    return []
  }
}

export default {
  state,
  mutations,
  actions,
  getters
}